#pragma once
#ifndef _FEM_BORDER_SEGMENT_
#define _FEM_BORDER_SEGMENT_

//================================================================================================================================
//================================================================================================================================
// QtCore
#include <QtCore/QList>
// Локальные
#include "core_global.h"

//================================================================================================================================
//================================================================================================================================
namespace fem
{
    /// Сегмент границы подобласти расчетной области.
    //
    /// Перед началом триангуляции расчетную область необходимо разбить на геометрически простые подобласти. Сегмент - это отрезок,
    /// являющийся частью границы какой-либо из таких подобластей. С сегментом всегда связано некоторое количество точек расчетной
    /// области. Эти точки геометрически принадлежат сегменту и являются основой будущей триангуляции, т.к. определяют структуру
    /// треугольной сетки и количество ее элементов. Подробнее см. алгоритм триангуляции.
    /// \sa Triangulation
    class CORE_EXPORT BorderSegment
    {
    public:
        /// Создание сегмента границы подобласти расчетной области.
        /// \param points Набор индексов точек расчетной области, принадлежащих сегменту.
        BorderSegment(const QList<int> &points) : m_Points(points), m_SpacingFactor(1.) {}
        
        /// Создание сегмента границы подобласти расчетной области.
        /// \param points Набор индексов точек расчетной области, принадлежащих сегменту.
        /// \param spacing_factor Коэффициент разрядки.
        /// \remark Указание коэффициента разрядки несёт только информационный характер. Т.е. он всего лишь
        /// указывает, на сколько точки, индексы которых заданы в \e points, отстоят друг от друга ни как не
        /// влияя на расположение этих точек.
        BorderSegment(const QList<int> &points, double spacing_factor) : m_Points(points), m_SpacingFactor(spacing_factor) {}

        /// Функция позволяет узнать глобальный номер первой точки сегмента, т.е. номер этой точки во всем наборе точек
        /// расчетной области.
        int lastPoint() const {return m_Points.last();}

        /// Функция позволяет узнать глобальный номер последней точки сегмента, т.е. номер этой точки во всем наборе точек
        /// расчетной области.
        int firstPoint() const {return m_Points.first();}

        /// Функция позволяет узнать глобальный номер (номер точки во всем наборе точек расчетной области) по локальному номеру
        /// точки (номер точки в наборе точек расчетной области, принадлежащих сегменту).
        int point(int index) const {return m_Points[index];}

        /// Получение числа точек расчетной области, принадлежащих сегменту.
        int numOfPoints() const {return m_Points.size();}

        /// Разворот сегмента в пространстве на 180 градусов.
        //
        /// По сути, данная функция попросту меняет поряд точек сегмента на обратный: первая точка становится последней, вторая -
        /// предпоследней,...., предпоследняя - второй, последняя - первой.
        void reverse();

        /// Получение коэффициента разрядки точек сегмента.
        double spacingFactor() const {return m_SpacingFactor;}

    private:
        /// Набор точек расчетной области, принадлежащих сегменту.
        //
        /// Под "набором точек расчетной области", в данном случае, следует понимать не всю совокупность точек области (в
        /// геометрическом смысле), а лишь те точки, в которых мы хотим узнать значение неизвестной функции. Точки хранятся в виде
        /// своих индексов в массиве всех точек расчетной области.
        QList<int> m_Points;

        /// Коэффициент разрядки.
        double m_SpacingFactor;
    };
}

#endif // _FEM_BORDER_SEGMENT_
